import chardet

def check_encoding(filename):
    rawdata = open(filename, 'rb').read()
    result = chardet.detect(rawdata)
    encoding = result['encoding']
    confidence = result['confidence']
    return encoding, confidence

file_path = r'C:\Users\19904\Desktop\000001.csv'# 添加文件路径 我使用的是绝对路径，所以我在这里进行了调整
encoding, confidence = check_encoding(file_path)
print(f"Encoding: {encoding}, Confidence: {confidence}")



import pandas as pd
# 原始字符串处理路径，半角括号
data = pd.read_csv(r'C:\Users\19904\Desktop\000001.csv')
# 可以打印数据查看是否读取成功
print(data.head())



# 使用pandas的read_csv函数读取CSV文件
# 这里使用了绝对路径：C:\Users\19904\Desktop\000001.csv
# 路径中的斜杠使用"/"可以避免Windows系统中反斜杠的转义问题
data = pd.read_csv('C:/Users/19904/Desktop/000001.csv')

# 在Jupyter Notebook中直接输入变量名，会以格式化表格形式显示数据内容
data

# 使用print()函数打印数据，输出格式与直接显示略有不同（更接近纯文本格式）
print(data)



# 查看数据对象的类型（通常会显示为pandas的DataFrame类型）
# 这有助于确认我们导入的数据是否以正确的数据结构存储
type(data)
# 打印数据集中所有列的名称（列标签）
# 以Index对象形式展示，方便了解数据集包含哪些字段信息
print(data.columns)
# 将列名转换为numpy数组形式并打印
# 相比columns属性，这种形式更便于进行数组相关的操作和处理
print(data.columns.values)




#频繁选取固定范围数据时的优化
#如果需要频繁选取类似“前 N 行”“某几列连续范围”的数据，可以将选取逻辑封装成函数，方便重复调用，减少重复代码
import pandas as pd

def select_rows(data, start, end):
    return data[start:end]

def select_rows_cols_by_index(data, row_start, row_end, col_start, col_end):
    return data.iloc[row_start:row_end, col_start:col_end]

def select_single_cell(data, row_idx, col_name):
    return data.at[row_idx, col_name]

# 假设 data 是已创建好的 DataFrame
# 调用示例
# rows_selected = select_rows(data, 0, 7)
# rows_cols_selected = select_rows_cols_by_index(data, 0, 5, 0, 6)
# cell_value = select_single_cell(data, 2, 'Open')




# 将'Day'列从字符串格式转换为日期时间格式
# pd.to_datetime() 函数用于将字符串转换为datetime对象
# format='%Y/%m/%d' 指定了输入日期的格式：年/月/日（如1990/12/19）
data['Day'] = pd.to_datetime(data['Day'],format = '%Y/%m/%d')
data



# 按照'Day'这一列对数据进行降序排序（即日期从新到旧）
data = data.sort_values(by=['Day'], axis=0, ascending=False)
data



# 使用help()函数查看sort_values方法的详细帮助信息
# help()函数可以显示任何Python对象、函数或方法的文档字符串
# 这对于初学者了解函数参数和用法非常有用
help(data.sort_values)

# 按照'Day'列对数据进行升序排序（即日期从旧到新）
# by=['Day'] 指定按'Day'列排序
# ascending=True 表示升序排列（False表示降序）
data = data.sort_values(by=['Day'],ascending=True)
data



#排序操作优化
#在按  Day  列排序时，若Day列数据是字符串格式（而非 Pandas 可直接识别的datetime类型），按字符串排序可能不符合日期的先后逻辑。所以可以先将Day列转换为datetime类型，再进行排序
# 将'Day'列转换为datetime类型
data['Day'] = pd.to_datetime(data['Day'])
# 按'Day'列升序排序（即日期从旧到新）
data_sorted = data.sort_values(by=['Day'], ascending=True)


# 将'Day'列设置为数据框的索引
# set_index() 函数用于将指定列设置为DataFrame的索引
# inplace=True 表示直接在原数据框上进行修改，不创建新的数据框
# 设置索引后，可以通过日期直接访问对应的行数据
data.set_index('Day', inplace = True)
data


# 使用时间范围筛选数据，获取1995年12月到2000年4月的数据
# 当'Day'列被设置为索引后，可以直接使用日期范围进行筛选
# '1995-12':'2000-04' 表示从1995年12月开始到2000年4月结束的时间范围
# 这种筛选方式对于时间序列数据分析非常有用
data['1995-12':'2000-04']